package com.atguigu.gulimall.seckill;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @Author 小坏
 * @Date 2021/2/25 19:08
 * @Version 1.0
 * @program: 父工程 gulimall 万物起源之地
 * 秒杀服务
 *
 *
 * Sentinel
 * 1、导入pom
 *      <dependency>
 *     <groupId>com.alibaba.cloud</groupId>
 *     <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
 *      </dependency>
 *
 * 2、下载sentinel控制台
 *          https://github.com/alibaba/Sentinel/releases
 *
 * 3、配置sentinel 控制台地址
 *          #sentinel 限流 传输端口port
 *          spring.cloud.sentinel.transport.dashboard=192.168.247.110:8333
 *           spring.cloud.sentinel.transport.port=8719
 *
 * 4、问题重启失效
 *              文档解决请参考我写的文档
 *
 *  5、Sentinel实时监控的问题
 *      1、配置pom
 *       <dependency>
 *     <groupId>org.springframework.boot</groupId>
 *     <artifactId>spring-boot-starter-actuator</artifactId>
 *      </dependency>
 *
 * 2、配置文件配置暴漏
 *     #暴漏
 *         management.endpoints.web.exposure.include= *
 *
 *  使用Sentinal来保护feign远程调用：熔断
 *  1)、调用放的熔断保护、：feign.sentinal.enabled=true
 *  2)、调用放手动指定远程服务的降级策略
 *  3)、超大浏览的时候，必须牺牲一些远程服务。在服务的提供方(远程服务)、指定降级策略；提供方是在运行。但是不运行自己的业务逻辑、
 *   返回的是默认的熔断数据（限流数据）
 *  4)、自定义受保护资源
 *  5)、自定义受保护的资源
 *      1)、代码
 *              try(Entry entry = SphU.entry ("seckillSkus")){
 *                  //业务逻辑
 *              }catch(Exception e){}
 *      2)、基于注解。
 *        @SentinelResource(value = "getCurrentSeckillSkusResource",blockHandler = "blockHandler")
 *        无论是1，2方式一定要配置被限流以后默认返回
 *        url请求可以设置统一返回：WebCallbackManager 统一返回
 */
@EnableRabbit //监听MQ消息的时候可以加
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class GuliMallSeckillApplication {
    public static void main(String[] args) {
        SpringApplication.run (GuliMallSeckillApplication.class);
    }

}
